package fr.bugtracker.entity.technique;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.validator.constraints.NotEmpty;

import fr.bugtracker.dao.technique.IdentifiableEntity;

/**
 * Classe entité Information
 */
@Entity
@Table(name = "utilisateur_information")
@TableGenerator(name = "sequence_information", pkColumnValue = "seq_information", table = "sequence", pkColumnName = "seq_name", valueColumnName = "seq_count", allocationSize = 1)
public class Information implements IdentifiableEntity {

	/**
	 *
	 */
	private static final long serialVersionUID = -8891539610610915615L;
	/**
	 * identifiant technique
	 */
	@Id
	@Column(name = "id", unique = true, length = 10)
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "sequence_information")
	private Integer id;
	/**
	 * le nom de l'utilisateur
	 */
	@NotEmpty
	@Column(name = "nom", length = 100, nullable = false)
	private String nom;
	/**
	 * le prénom de l'utilisateur
	 */
	@NotEmpty
	@Column(name = "prenom", length = 100, nullable = false)
	private String prenom;
	/**
	 * la date de naissance de l'utilisateur
	 */
	@Past
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "date_naissance", nullable = false)
	private Date dateNaissance;
	/**
	 * le numéro de téléphone de l'utilisateur
	 */
	@Pattern(regexp = "([0-9]{10}){0,1}")
	@Column(name = "numero_telephone", length = 10, nullable = true)
	private String numeroTelephone;
	/**
	 * le numéro de portable de l'utilisateur
	 */
	@Pattern(regexp = "([0-9]{10}){0,1}")
	@Column(name = "numero_portable", nullable = true)
	private String numeroPortable;

	/**
	 * Constructeur de la classe <code>Information</code>.
	 */
	public Information() {
	}

	/**
	 * @see fr.bugtracker.dao.technique.IdentifiableEntity#getId()
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut id.</b></p>
	 * @param pId L'attribut id à modifier.
	 */
	public void setId(Integer pId) {
		id = pId;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut nom.</b></p>
	 * @return Retourne l'attribut nom sous forme de <code>String</code>.
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut nom.</b></p>
	 * @param pNom L'attribut nom à modifier.
	 */
	public void setNom(String pNom) {
		nom = pNom;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut prenom.</b></p>
	 * @return Retourne l'attribut prenom sous forme de <code>String</code>.
	 */
	public String getPrenom() {
		return prenom;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut prenom.</b></p>
	 * @param pPrenom L'attribut prenom à modifier.
	 */
	public void setPrenom(String pPrenom) {
		prenom = pPrenom;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut dateNaissance.</b></p>
	 * @return Retourne l'attribut dateNaissance sous forme de <code>Date</code>.
	 */
	public Date getDateNaissance() {
		return dateNaissance;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut dateNaissance.</b></p>
	 * @param pDateNaissance L'attribut dateNaissance à modifier.
	 */
	public void setDateNaissance(Date pDateNaissance) {
		dateNaissance = pDateNaissance;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut numeroTelephone.</b></p>
	 * @return Retourne l'attribut numeroTelephone sous forme de <code>String</code>.
	 */
	public String getNumeroTelephone() {
		return numeroTelephone;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut numeroTelephone.</b></p>
	 * @param pNumeroTelephone L'attribut numeroTelephone à modifier.
	 */
	public void setNumeroTelephone(String pNumeroTelephone) {
		numeroTelephone = pNumeroTelephone;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut numeroPortable.</b></p>
	 * @return Retourne l'attribut numeroPortable sous forme de <code>String</code>.
	 */
	public String getNumeroPortable() {
		return numeroPortable;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut numeroPortable.</b></p>
	 * @param pNumeroPortable L'attribut numeroPortable à modifier.
	 */
	public void setNumeroPortable(String pNumeroPortable) {
		numeroPortable = pNumeroPortable;
	}

	/**
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Information)) {
			return false;
		}
		Information other = (Information) obj;
		return new EqualsBuilder().append(id, other.id).isEquals();
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return new HashCodeBuilder(17, 37).append(id).toHashCode();
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Information [id=" + id + ", nom=" + nom + ", prenom=" + prenom + ", dateNaissance=" + dateNaissance + ", numeroTelephone=" + numeroTelephone + ", numeroPortable=" + numeroPortable + "]";
	}

}